/**
 * 1 获取用户的收获地址
 *    1 绑定点击事件
 *    2 调用小程序内置 api 获取用户的收获地址  wx.chooseAddress
 * 
 *    3 获取 用户 对小程序 所授予 获取地址的 权限 状态 scope 
 *       1 假设 用户 点击获取地址的提示框 确定 authSetting scope.address
 *          scope 值 true 直接调用 收获地址
 *       2 假设 用户 从来没有调用过 收获地址的api
 *          scope 值 undefined 直接调用 收获地址
 *       3 假设 用户 点击获取收获地址的提示框 取消
 *          scope 值 false
 *          1 诱导用户 自己 打开 授权设置页面 当用户重新给与 获取地址权限的时候
 *          2 获取收获地址
 *       4 把获取到的收获地址 存入到 本地存储中
 * 2 已更新, 9/25起这三个接口不用授权直接返回true
 * 3 页面加载完毕
 *   0 onLoad onShow
 *   1 获取本地存储中的地址数据
 *   2 把数据 设置给data中的一个变量
 * 4 onShow
 *   0 回到了商品详情页面 第一次添加商品的时候 手动添加了属性
 *      1 num=1;
 *      2 checked=true;
 *   1 获取缓存中的购物车数组
 *   2 把购物车数据 填充到data中
 * 5 全选的实现 数据的展示
 *   1 onShow 获取缓存中的购物车数组
 *   2 根据购物车中的商品数据 所有的商品都被选中 checked=true 全选就被选中
 * 6 总价格和总数量
 *   1 只有商品被选中使 我们才计算
 *   2 获取购物车数组
 *   3 遍历
 *   4 判断商品是否被选中
 *   5 总价格 += 商品单价 * 商品数量
 *   5 总数量 += 商品的数量
 *   6 把计算后的价格和数量 设置回data中即可
 * 7 商品选中
 *   1 绑定change事件
 *   2 获取被修改的商品对象
 *   3 商品对象的选中状态 取反
 *   4 重新填充回data中和缓存中
 *   5 重新计算全选 总价格 总数量
 * 8 全选和反选
 *    1 全选复选框绑定事件 change
 *    2 获取 data中的全选变量 allChecked
 *    3 直接取反 allChecked = allChecked
 *    4 遍历购物车数组 让里面 商品 选中状态跟随 allChecked 改变而改变
 *    5 把购物车数组 和 allChecked 重新设置回data 把购物车重新设置回 缓存中
 * 9 商品数量的编辑 
 *    1 "+" "-" 按钮 绑定同一个点击事件 区分的关键 自定义属性
 *       1 "+" "+1"
 *       2 "-" "-1"
 *    2 传递被点击的商品id goods_id
 *    3 获取data中的购物车数组 来获取需要被修改的商品对象
 *    4 当 购物车的数量 =1 同时 用户 点击 "-"
 *      弹窗提示(showModal) 询问用户 是否要删除
 *      1 确定 直接执行删除
 *      2 取消 什么都不做
 *    4 直接修改商品对象的数量 num
 *    5 把cart数组 重新设置回 缓存中 和data中 this.setCart
 * 10 点击结算
 *    1 判断有没有收获地址信息
 *    2 判断用户有没有选购商品
 *    3 经过以上页面 跳转到 支付页面
 */
import { getSetting, chooseAddress, openSetting, showModal, showToast } from "../../utils/asyncWx.js"
import { request } from "../../request/index.js";
Page({
    data: {
        address: {},
        cart: [],
        allChecked: false,
        totalPrice: 0,
        totalNum: 0,
        userInfo: {},
    },

    onShow() {
        wx.hideLoading();
        // 获取缓存中的用户信息
        const userInfo = wx.getStorageSync("userInfo");
        // 获取缓存中的收货地址信息
        const address = wx.getStorageSync("address");
        // 获取缓存中的购物车数据
        const cart = wx.getStorageSync("cart") || [];

        this.setData({ address, userInfo });
        this.setCart(cart);
    },

    // 商品选中
    handleItemChange(e) {
        // 1 获取被修改的商品的id
        const goods_id = e.currentTarget.dataset.id;
        // 2 获取购物车数组
        let { cart } = this.data;
        // 3 找到被修改的商品对象
        let index = cart.findIndex(v => v.goodsId === goods_id);
        // 4 选中状态取反
        cart[index].checked = !cart[index].checked;

        this.setCart(cart);
    },

    // 设置购物车状态 同时 重新计算 底部工具栏的数据 全选 总价格 购买数量
    setCart(cart) {
        // 5 6 把 购物车数据重新设置为data中和缓存中

        let allChecked = true;

        // 1 总价格 总数量
        let totalPrice = 0;
        let totalNum = 0;
        cart.forEach(v => {
            if (v.checked) {
                totalPrice += v.num * v.price;
                totalNum += v.num;
            } else {
                allChecked = false;
            }
        })

        // 判断数组是否为空
        allChecked = cart.length != 0 ? allChecked : false;

        this.setData({
            cart,
            totalPrice,
            totalNum,
            allChecked
        })

        wx.setStorageSync("cart", cart);
    },

    // 商品全选功能
    handleItemAllCheck() {
        // 1 获取data中的数据
        let { cart, allChecked } = this.data;
        // 2 修改值
        allChecked = !allChecked;
        // 3 循环修改cart数组 中的商品选中状态
        cart.forEach(v => v.checked = allChecked);
        // 4 把修改后的值 填充回data或缓存中
        this.setCart(cart);
    },

    // 商品数量的编辑功能
    async handleItemNumEdit(e) {
        // 1 获取传递过来的参数
        const { operation, id } = e.currentTarget.dataset;
        // 2 获取购物车数组
        let { cart } = this.data;
        // 3 找到需要修改的商品的索引
        const index = cart.findIndex(v => v.goodsId === id);
        // 4 判断是否要执行删除
        if (cart[index].num === 1 && operation === -1) {

            const res = await showModal({ content: "你是否要删除？" });
            if (res.confirm) {
                cart.splice(index, 1);
                // 这里的this 指的是 外部的this
                this.setCart(cart);
            }
        } else {
            // 4 进行修改
            cart[index].num += operation;
            // 5 设置回缓存和data中
            this.setCart(cart);
        }
    },

    // 点击 结算
    async handlePay() {

        const { address, totalNum, userInfo } = this.data;

        // 1 判断登录状态
        if (!userInfo) {
            wx.showModal({
                title: '提示',
                content: '您还没有登录',
                showCancel: true,
                cancelText: '取消',
                cancelColor: '#000000',
                confirmText: '登录授权',
                confirmColor: '#3CC51F',
                success: (res) => {
                    if (res.confirm) {
                        wx.showLoading({
                            title: "加载中",
                            mask: true,
                            success: (res) => {
                                setTimeout(function() {
                                    wx.switchTab({
                                        url: '/pages/user/index',
                                        fail: () => { return; }
                                    });
                                }, 1000);
                            },
                        });
                    } else { return; }
                },
            });
            return;
        }

        // 2 判断用户状态
        const index = await request({ url: "/user/getByOpenId", data: { open_id: this.data.userInfo.open_id }, method: "GET" });
        if (index.data.data.length === 1) {
            if (index.data.data[0].state === 1) {
                showToast({ title: "您已被封禁，详情请联系客服", icon: "none" });
                wx.removeStorageSync("userInfo");
                wx.removeStorageSync("cart");
                wx.removeStorageSync("address");
                wx.removeStorageSync("expiration");
                this.setData({
                    userInfo: []
                });
                return;
            }
            if (index.data.data[0].state === 2) {
                showToast({ title: "您已被封禁，详情请联系客服", icon: "none" });
                return;
            }
        }

        // 3 判断收获地址
        if (!address) {
            wx.showModal({
                title: '提示',
                content: '您还没有选择收货地址',
                showCancel: true,
                cancelText: '取消',
                cancelColor: '#000000',
                confirmText: '前往选择',
                confirmColor: '#3CC51F',
                success: (res) => {
                    if (res.confirm) {
                        wx.showLoading({
                            title: "加载中",
                            mask: true,
                            success: (res) => {
                                setTimeout(function() {
                                    wx.navigateTo({
                                        url: '/pages/user_detail/index',
                                        fail: () => { return; }
                                    });
                                }, 1000);
                            },
                        });
                    } else { return; }
                },
            });
            return;
        }
        // 4 判断用户是否选购商品
        if (totalNum === 0) {
            await showToast({ title: "您还没有选购商品" });
            return;
        }
        // 5 跳转到支付页面
        wx.navigateTo({
            url: '/pages/pay/index'
        });
    }
})